package com.ilearn.proxy.jdk;

import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;

public class JDKProxyTest {

    public static void main(String[] args) {
        JDK58 jdkMeipo = new JDK58();
        try {
            Object instance = jdkMeipo.getInstance(new XieMu());
            //System.out.println(instance);
            Person xieMuProxy = (Person) instance;
            xieMuProxy.findLove();
            System.out.println(xieMuProxy.getClass());

            //原理：
            // 1、 拿到被代理对象的引用，并且获取到它的所有接口，反射获取
            // 2、JDK Proxy类重新生成一个新的类，同时新类要实现被代理类所有实现的接口
            // 3、动态生成Java代码、把新加的业务逻辑方法，由一定的逻辑代码去调用（在代码体现）
            // 4、编译新生成的Java代码.class
            // 5、再重新加载到JVM中运行
            // 以上这个过程就叫做字节码重组


            // class com.sun.proxy.$Proxy0
            // JDK中有一个规范，只要是$开头的一般都是自动生成的。
            // 通过反编译工具可以查看源代码
            // 从内存中，把代理类$Proxy0写入到文件中：

            byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});

            FileOutputStream fos = new FileOutputStream("D:\\iProject\\iLearnJava\\Design-Patterns-Proxy\\$Proxy0.class");

            fos.write(bytes);
            fos.flush();
            fos.close();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
